home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
476-500
/
disk_484
/
msclock
/
source
/
msclock-handler.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
8KB
|
228 lines
/*
* MSClock-Handler.c © 12.02.91 by Martin Steppler
*/
// includes
#include <stdio.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <devices/inputevent.h>
#include <devices/printer.h>
#include <devices/timer.h>
#include <devices/input.h>
#include <graphics/gfx.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <exec/exec.h>
#include <hardware/cia.h>
#include <functions.h>
// prototypes
void ciao(void);
// reference to the absolute address of ciab
extern struct CIA ciab;
// defines
#define SIG_CHANGE SIGBREAKF_CTRL_C
#define SIG_CLOSE SIGBREAKF_CTRL_D
#define CHILD_READY SIGBREAKF_CTRL_D
#define EOS 0
#define PORTNAME "Martin's Clock-Port"
struct TheClock
{
struct MsgPort Port; // Global messageport.
BPTR Segment; // Pointer to handler segment.
LONG SegSize; // Size of TheClock structure.
struct Task *Father; // Calling process.
struct Task *Child; // Waiting process
int LeftEdge; // LeftEdge of our window
int Width; // Width of our window
int Online; // Online flag
int Flags; // display-flags
int FlagsBackup; // backup of the display-flags
int Status; // status-flag
};
// globals
char DateBuf[60];
struct TextAttr TopazText = { (UBYTE *)"topaz.font",8,0,0};
struct IntuiText TextPrint = { 0,1,JAM2,0,0,NULL,(UBYTE *)DateBuf,NULL};
struct NewWindow ClockWindow = { 146,1,432,8,1,0,EOS, BORDERLESS, NULL,NULL,EOS,NULL,NULL,0,0,0,0,WBENCHSCREEN};
struct Window *Window=NULL;
struct timerequest TimeReq;
struct MsgPort *TimerPort=NULL;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct DosLibrary *DosBase;
struct TheClock *TheClock;
/* _main():
*
* Modified Aztec C startup-routine, no CLI parsing,
* no Workbench parsing, absolutely nothing.
*/
long
_main()
{
register struct Process *ThatsMe = (struct Process *)FindTask(NULL);
register ULONG SignalSet;
char TempBuf[60];
char *Days[14]={ "Son","Mon","Die","Mit","Don","Fre","Sam",
"Sun","Mon","Tue","Wed","Thu","Fri","Sat" };
struct DateStamp Date;
long n,eng,Month,Day,Year,chip_free,fast_free,hh=0,mm=0,ss=0,lastsec=-1;
int i;
// If somebody called us from CLI...
if(ThatsMe -> pr_CLI) return(10);
// Is the TheClock structure anywhere?
if(!(TheClock = (struct TheClock *)FindPort(PORTNAME))) return(10);
// open libraries
if(!(IntuitionBase = OpenLibrary("intuition.library",0))) {
Signal(TheClock -> Father, CHILD_READY);
return(20);
}
if(!(GfxBase = OpenLibrary("graphics.library",0))) {
CloseLibrary(IntuitionBase);
Signal(TheClock -> Father, CHILD_READY);
return(20);
}
if(!(DosBase = OpenLibrary("dos.library",0))) {
CloseLibrary(GfxBase);
CloseLibrary(IntuitionBase);
Signal(TheClock -> Father, CHILD_READY);
return(20);
}
if(TimerPort=(struct MsgPort *) CreatePort("Timer Port",0)) {
if(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)&TimeReq,0)==(long)NULL) {
TimeReq.tr_node.io_Message.mn_ReplyPort=TimerPort;
TimeReq.tr_node.io_Command=TR_ADDREQUEST;
TimeReq.tr_node.io_Flags=0;
TimeReq.tr_node.io_Error=0;
TimeReq.tr_time.tv_secs=0;
TimeReq.tr_time.tv_micro=1000000; // delay
SendIO((struct IORequest *) &TimeReq.tr_node);
}
else ciao();
}
else ciao();
TheClock -> Child = (struct Task *)FindTask(NULL);
TheClock -> Status = 1;
// Go into infinite loop waiting for signals.
FOREVER
{
if(TheClock -> Status == 1) { // switch clock on
TheClock -> Status = 2;
ClockWindow.LeftEdge = TheClock -> LeftEdge;
ClockWindow.Width = TheClock -> Width;
if(Window=(struct Window *) OpenWindow(&ClockWindow)) {
if(Window->IFont->tf_YSize>8) TextPrint.ITextFont=&TopazText;
TheClock->Status = 0;
}
else ciao();
// Tell father to finish.
Signal(TheClock -> Father, CHILD_READY);
}
if(!TheClock->Status) { // show mem, date, online-time and/or time
chip_free = AvailMem(MEMF_CHIP) >> 10;
fast_free = AvailMem(MEMF_FAST) >> 10;
DateStamp((struct DateStamp *)&Date) ;
n = Date.ds_Days - 2251;
Year = (4 * n + 3) / 1461;
n -= 1461 * Year / 4;
Year += 1984;
Month = (5 * n + 2) / 153;
Day = n - (153 * Month + 2) / 5 + 1;
Month += 3; n=TheClock->Flags;
if(Month>12) { Year++; Month -= 12; }
DateBuf[0]=EOS;
if(n & 4) sprintf(DateBuf, "A:%-4d F:%-4d C:%-3d", chip_free+fast_free, fast_free, chip_free);
if(n & 32) {
// Check port a of cia b. Is there a carrier?
if(!(ciab . ciapra & CIAF_COMCD)) // Online ?
{
if(!TheClock -> Online) { // Time reset
hh=mm=ss=0; TheClock -> Online = TRUE;
}
// Increment time counter.
if(lastsec != Date.ds_Tick/TICKS_PER_SECOND) {
lastsec = Date.ds_Tick/TICKS_PER_SECOND;
if(++ss == 60) {
ss=0; if(++mm == 60) { mm=0; ++hh; }
}
}
}
else TheClock -> Online = FALSE;
sprintf(TempBuf, " %02ld:%02ld:%02ld", hh, mm, ss);
strcat(DateBuf,TempBuf);
}
if(n & 2) {
eng = (n & 8) ? 7:0;
if(n & 16) sprintf(TempBuf, " %s %02ld-%02ld-%02ld", Days[(Day + Year + (Year - (Month < 3)) / 4 + 3 * Month - 2 * (Month > 2) - (Month - 1 - (Month > 8)) / 2 + 2) % 7 +eng], Month, Day, Year-1900);
else sprintf(TempBuf, " %s %02ld.%02ld.%02ld", Days[(Day + Year + (Year - (Month < 3)) / 4 + 3 * Month - 2 * (Month > 2) - (Month - 1 - (Month > 8)) / 2 + 2) % 7 +eng], Day, Month, Year-1900);
strcat(DateBuf,TempBuf);
}
if(n & 1) {
sprintf(TempBuf, " %02ld:%02ld:%02ld", Date.ds_Minute/60, Date.ds_Minute%60, Date.ds_Tick/TICKS_PER_SECOND);
strcat(DateBuf, TempBuf);
}
PrintIText(Window->RPort,&TextPrint, 0,0);
}
SignalSet = Wait(SIG_CLOSE | SIG_CHANGE | (1 << TimerPort->mp_SigBit));
if(SignalSet & SIG_CLOSE) {
ciao();
CloseLibrary(IntuitionBase);
CloseLibrary(GfxBase);
CloseLibrary(DosBase);
Forbid();
Signal(TheClock -> Father, CHILD_READY);
return(0);
}
else if(SignalSet & SIG_CHANGE) {
if(Window) { CloseWindow(Window); Window = NULL; }
TheClock->Flags = TheClock->FlagsBackup;
TheClock->Status = 1;
}
if(SignalSet & (1 << TimerPort->mp_SigBit)) {
if(GetMsg(TimerPort)) {
TimeReq.tr_time.tv_secs=0;
TimeReq.tr_time.tv_micro=1000000;
SendIO((struct IORequest *) &TimeReq.tr_node);
}
}
}
}
void
ciao(void)
{
if(TimerPort) GetMsg(TimerPort);
if(TimeReq.tr_node.io_Message.mn_ReplyPort) CloseDevice((struct IORequest *)&TimeReq);
if(TimerPort) { DeletePort(TimerPort); TimerPort = NULL; }
if(Window) { CloseWindow(Window); Window = NULL; }
}